package com.cskaoyan.javase.oop2.encapsulate._2polymorphic._0introduction;

/**
 * 多态的引入
 * 什么是多态（polymorphic）呢？
 * 从字面意义上理解
 * 同一个事物，在不同的时刻/情况表现出不同的状态，就可以称之为多态。
 *
 * 在Java的多态当中，多态指的是：
 *      1.同一种事物：同一个引用（即父类的引用）
 *      2.不同的情况：指向不同的对象（不同的子类对象）
 *      3.不同的状态：调用同名方法会体现出不同的行为
 *  总结来说
 *  Java中的多态指的是，同一个父类引用指向不同子类对象时
 *  调用同名成员方法，根据指向实际对象的不同，得到的行为也会随之不不同。
 *
 *  Java程序中产生多态的前提:
 *      1.必须要有继承,必须有父类和多个子类
 *      2.必须要存在方法的重写
 *      3.需要父类引用指向不同子类对象
 *
 * 反过来,总结一下不能发生多态的场景:
 *      1.不能继承的类,被final修饰的类
 *      2.不能重写的方法:
 *          a.私有方法以及子类没有权限的方法,可以继承,没有权限,不能重写
 *          b.final修饰的方法,可以继承,不能重写
 *          c.静态方法,不能继承,不能重写
 *          d.构造器,不能继承,不能重写
 *
 *
 * @since 10:51
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 同一个父类引用
        Phone p;
        // 指向不同的子类对象,调用同名成员方法,得出不同的结果
        p = new HuaWei();
        p.playGame();
        p = new MiPhone();
        p.playGame();
        p = new IPhone();
        p.playGame();
    }
}

class Phone {
    public void playGame() {
        System.out.println("打游戏!");
    }
}

class IPhone extends Phone {
    @Override
    public void playGame() {
        System.out.println("玩和平精英!");
    }
}

class MiPhone extends Phone {
    @Override
    public void playGame() {
        System.out.println("玩王者荣耀!");
    }
}

class HuaWei extends Phone {
    @Override
    public void playGame() {
        System.out.println("玩原神!");
    }
}